﻿//using Abp.Domain.Uow;
//using GN.Pay.Application.SystemApp;
//using GN.Pay.Application.TradeApp;
//using GN.Pay.Application.TradeApp.Dto.Output;
//using GN.Pay.TradeChannel;
//using GN.Pay.TradeChannel.AliPay;
//using GN.Pay.TradeChannel.Gyb;
//using GN.Pay.TradeChannel.UnionPay;
//using GN.Pay.TradeChannel.YJPay;
//using GN.Pay.Utils;
//using GN.Pay.GatewayWeb.JumpNotify;
//using GN.Pay.GatewayWeb.Models;
//using System;
//using System.Collections.Generic;
//using System.Linq;
//using System.Net;
//using System.Text;
//using System.Transactions;
//using System.Web;
//using System.Web.Mvc;

//namespace GN.Pay.GatewayWeb.Controllers
//{
//    /// <summary>
//    /// 通知控制器
//    /// </summary>
//    public class NotifyController : PayControllerBase
//    {
//        private readonly ITradeNotifyAppService tradeNotifyAppService;
//        private readonly ISystemQueryAppService systemQueryAppService;

//        public NotifyController(ITradeNotifyAppService tradeNotifyAppService,
//            ISystemQueryAppService systemQueryAppService)
//        {
//            this.tradeNotifyAppService = tradeNotifyAppService;
//            this.systemQueryAppService = systemQueryAppService;
//        }

//        //字典付款通知
//        private void DictionaryPayNotify(string channelId, string name)
//        {
//            ITradeChannel channel = this.tradeNotifyAppService.GetTradeChannel(channelId);
//            if (channel != null)
//            {
//                try
//                {
//                    var requestDictionary = PreParam.GetQueryDictionary(this.Request);
//                    channel.OrderPayNotify(this.tradeNotifyAppService, requestDictionary);
//                    Response.Write(channel.PayNotifyResponse(true));
//                    Response.StatusCode = (int)HttpStatusCode.OK;
//                }
//                catch (Exception err)
//                {
//                    Logger.Error(name + "付款通知错误", err);
//                    Response.Write(channel.PayNotifyResponse(false));
//                }
//            }
//            else
//            {
//                Logger.Error(name + "付款通知错误,无 " + channelId + " 实现");
//            }
//        }

//        //字典退款款通知
//        private void DictionaryRefundNotify(string channelId, string name)
//        {
//            ITradeChannel channel = this.tradeNotifyAppService.GetTradeChannel(channelId);
//            if (channel != null)
//            {
//                try
//                {
//                    var requestDictionary = PreParam.GetQueryDictionary(this.Request);
//                    channel.OrderRefundNotify(this.tradeNotifyAppService, requestDictionary);
//                    Response.Write(channel.RefundNotifyResponse(true));
//                }
//                catch (Exception err)
//                {
//                    Logger.Error(name + "退款通知错误", err);
//                    Response.Write(channel.RefundNotifyResponse(false));
//                }
//            }
//            else
//            {
//                Logger.Error(name + "退款通知错误,无 " + channelId + " 实现");
//            }
//        }

//        //Xml付款通知
//        private void XmlPayNotify(string channelId, string name)
//        {
//            ITradeChannel channel = this.tradeNotifyAppService.GetTradeChannel(channelId);
//            if (channel != null)
//            {
//                try
//                {
//                    string message;
//                    using (var input = Request.InputStream)
//                    {
//                        message = input.ReadStreamString();
//                    }
//                    channel.OrderPayNotify(this.tradeNotifyAppService, message);
//                    Response.Write(channel.PayNotifyResponse(true));
//                }
//                catch (Exception err)
//                {
//                    Logger.Error(name + "付款通知错误", err);
//                    Response.Write(channel.PayNotifyResponse(false));
//                }
//            }
//            else
//            {
//                Logger.Error(name + "付款通知错误,无 " + channelId + " 实现");
//            }
//        }

//        /// <summary>
//        /// 工作单元
//        /// </summary>
//        /// <param name="action"></param>
//        private void UnitOfWork(Action action)
//        {
//            if (action != null)
//            {
//                var options = new UnitOfWorkOptions()
//                {
//                    IsTransactional = true,
//                    IsolationLevel = System.Transactions.IsolationLevel.RepeatableRead,
//                    Scope = TransactionScopeOption.RequiresNew
//                };
//                using (var unit = this.UnitOfWorkManager.Begin(options))
//                {
//                    action();
//                    unit.Complete();
//                }
//            }
//        }

//        /// <summary>
//        /// 支付宝订单支付通知
//        /// </summary>
//        public void AliPayOrderPay()
//        {
//            DictionaryPayNotify("AliPay.Transfer", "支付宝");
//        }

//        /// <summary>
//        /// 支付宝订单退款通知
//        /// </summary>
//        public void AliPayOrderRefund()
//        {
//            DictionaryRefundNotify("AliPay.Transfer", "支付宝");
//        }

//        /// <summary>
//        /// 返回成功等待
//        /// </summary>
//        /// <param name="tradeNo">交易号</param>
//        /// <returns></returns>
//        private ActionResult ReturnWaitResult(string tradeNo)
//        {
//            var apply = systemQueryAppService.GetByTradeNo(tradeNo);
//            return ReturnWaitResult(apply);
//        }

//        /// <summary>
//        /// 返回成功等待
//        /// </summary>
//        /// <param name="apply">申请</param>
//        /// <returns></returns>
//        private ActionResult ReturnWaitResult(PayApplyOutput apply)
//        {
//            if (apply == null)
//            {
//                return this.ErrorView("出错", "同步出错", "未找到对应的申请或账单，可能由于系统太忙，正在处理中，若长时间没反应，请直接查询订单以确认支付情况");
//            }
//            var notifyData = PayApplyNotifyService.GetAndRemovePayNotifyData(apply.ApplyId);
//            if (notifyData == null)
//            {
//                notifyData = new Core.Values.PayNotifyData() { ApplyId = apply.ApplyId, ApplyTime = apply.ApplyTime, Body = apply.Body, OrderNo = apply.OrderNo, OrderMoney = apply.OrderMoney, TradeNo = "" };
//            }
//            return View("PayReturn", notifyData);
//        }

//        /// <summary>
//        /// 支付宝订单返回地址
//        /// </summary>
//        /// <returns></returns>
//        public ActionResult AliPayOrderReturn()
//        {
//            try
//            {
//                ITradeChannel channel = this.tradeNotifyAppService.GetTradeChannel("AliPay.Transfer");
//                if (channel == null)
//                {
//                    return this.ErrorView("出错", "跳转出错", "未能匹配对应的支付类型");
//                }
//                AliPayServiceBase aliPay = channel as AliPayServiceBase;
//                if (aliPay == null)
//                {
//                    return this.ErrorView("出错", "支付成功跳转出错", "未能转换对应的支付类型");
//                }
//                var requestDictionary = PreParam.GetQueryDictionary(this.Request);
//                var entity = aliPay.OrderPayNotifyResponse(requestDictionary);
//                if (!entity.IsSuccess())
//                {
//                    return this.ErrorView("出错", "支付失败", "未能成功支付，若已确订支付成功请查询订单进行确认");
//                }
//                return ReturnWaitResult(entity.Out_Trade_No);
//            }
//            catch (Exception err)
//            {
//                return this.ErrorView("出错", "跳转出错", "异常" + err.Message);
//            }
//        }

//        /// <summary>
//        /// 微信扫码订单支付通知
//        /// </summary>
//        public void WeiXinOrderPay()
//        {
//            XmlPayNotify("WeiXin.QRCode", "微信");
//        }

//        /// <summary>
//        /// 贵阳银行订单支付通知
//        /// </summary>
//        public ActionResult GyCCBOrderPay()
//        {
//            ITradeChannel channel = this.tradeNotifyAppService.GetTradeChannel("Gyb.WebPay");
//            if (channel != null)
//            {
//                try
//                {
//                    var requestDictionary = PreParam.GetQueryDictionary(this.Request);
//                    UnitOfWork(() =>
//                    {
//                        channel.OrderPayNotify(this.tradeNotifyAppService, requestDictionary);
//                    });
//                    GyCCBWebPayService payService = (GyCCBWebPayService)channel;
//                    if (payService == null)
//                    {
//                        Response.Write(channel.PayNotifyResponse(false));
//                        return this.ErrorView("出错", "支付成功跳转出错", "未能转换对应的支付类型");
//                    }
//                    var entity = payService.OrderPayNotifyResponse(requestDictionary);
//                    return ReturnWaitResult(entity.TermSsn);
//                }
//                catch (Exception err)
//                {
//                    Logger.Error("贵阳银行付款通知错误", err);
//                    return this.ErrorView("出错", "付款通知", err.Message);
//                }
//            }
//            else
//            {
//                Logger.Error("贵阳银行付款通知错误,无 Gyb.WebPay 实现");
//                return this.ErrorView("出错", "付款通知", "贵阳银行付款通知错误,无 Gyb.WebPay 实现");
//            }
//        }

//        /// <summary>
//        /// 付款返回
//        /// </summary>
//        /// <param name="applyId">申请号</param>
//        /// <returns></returns>
//        public ActionResult PayReturn(string applyId)
//        {
//            var notifyData = PayApplyNotifyService.GetAndRemovePayNotifyData(applyId);
//            if (notifyData == null)
//            {
//                return this.ErrorView("出错", "同步出错", "未找到对应的申请或账单，可能由于系统太忙，正在处理中，若长时间没反应，请直接查询订单以确认支付情况");
//            }
//            return View("PayReturn", notifyData);
//        }

//        /// <summary>
//        /// 银联订单支付通知
//        /// </summary>
//        public void UnionOrderPay()
//        {
//            DictionaryPayNotify("Union.WebPay", "银联支付");
//        }

//        public ActionResult UnionOrderPayReturn()
//        {
//            ITradeChannel channel = this.tradeNotifyAppService.GetTradeChannel("Union.WebPay");
//            if (channel != null)
//            {
//                try
//                {
//                    var requestDictionary = PreParam.GetQueryDictionary(this.Request);                    
//                    UnitOfWork(() =>
//                    {
//                        channel.OrderPayNotify(this.tradeNotifyAppService, requestDictionary);
//                    });                    
//                    UnionPayWebPayService payService = (UnionPayWebPayService)channel;
//                    if (payService == null)
//                    {
//                        return this.ErrorView("出错", "支付成功跳转出错", "未能转换对应的支付类型");
//                    }
//                    var entity = payService.OrderPayNotifyResponse(requestDictionary);
//                    return ReturnWaitResult(entity.orderId);
//                }
//                catch (Exception err)
//                {
//                    Logger.Error("银联付款通知错误", err);
//                    return this.ErrorView("出错", "付款通知", err.Message);
//                }
//            }
//            else
//            {
//                Logger.Error("银联付款通知错误,无 Union.WebPay 实现");
//                return this.ErrorView("出错", "付款通知", "银联付款通知错误,无 Union.WebPay 实现");
//            }
//        }

//        public void UnionOrderRefund()
//        {
//            DictionaryRefundNotify("Union.WebPay", "银联支付");
//        }

//        /// <summary>
//        /// 易极付付款通知
//        /// </summary>
//        public void JYPayOrderPay()
//        {
//            DictionaryPayNotify("JY.WebPay", "易极付");
//        }

//        /// <summary>
//        /// 易极付付款同步通知
//        /// </summary>
//        public ActionResult JYPayOrderPayReturn()
//        {
//            try
//            {
//                ITradeChannel channel = this.tradeNotifyAppService.GetTradeChannel("JY.WebPay");
//                if (channel == null)
//                {
//                    return this.ErrorView("出错", "跳转出错", "未能匹配对应的支付类型");
//                }
//                YJPayServiceBase pay = channel as YJPayServiceBase;
//                if (pay == null)
//                {
//                    return this.ErrorView("出错", "支付成功跳转出错", "未能转换对应的支付类型");
//                }
//                var requestDictionary = PreParam.GetQueryDictionary(this.Request);
//                string tradeNo = null;
//                UnitOfWork(() =>
//                {
//                    tradeNo = pay.ReturnOrderPayNotify(tradeNotifyAppService, requestDictionary);
//                });
//                if (tradeNo == null)
//                {
//                    return this.ErrorView("出错", "跳转出错", "异常：交易可能失败造成的");
//                }
//                var apply = systemQueryAppService.GetByTradeNo(tradeNo);
//                return ReturnWaitResult(apply);
//            }
//            catch (Exception err)
//            {
//                return this.ErrorView("出错", "跳转出错", "异常：" + err.Message);
//            }
//        }

//        /// <summary>
//        /// 支付宝订单退款通知
//        /// </summary>
//        public void JYPayOrderRefund()
//        {
//            DictionaryRefundNotify("JY.WebPay", "易极付");
//        }
//    }
//}